package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ITaskDAO;
import org.jsola.hr.dto.TaskAddDTO;
import org.jsola.hr.dto.TaskUpdateDTO;
import org.jsola.hr.entity.TaskDO;
import org.jsola.hr.query.TaskQuery;
import org.jsola.hr.vo.TaskListVO;
import org.jsola.hr.vo.TaskVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 人力定时任务
 *
 * @author zhr
 */
public interface ITaskService extends IService<ITaskDAO, TaskDO> {

    /**
     * 新增人力定时任务
     *
     * @param taskAddDTO 新增人力定时任务DTO
     * @param tokenUser  当前用户
     * @return 人力定时任务详情信息
     */
    TaskVO save(TaskAddDTO taskAddDTO, TokenUser tokenUser);

    /**
     * 新增通知定时任务
     *
     * @param taskAddDTO 新增人力定时任务DTO
     * @param tokenUser  当前用户
     * @return 人力定时任务详情信息
     */
    TaskVO saveNoticeTask(TaskAddDTO taskAddDTO, TokenUser tokenUser);


    /**
     * 批量新增人力定时任务
     *
     * @param taskAddDTOList 新增人力定时任务DTO集合
     * @param tokenUser      当前用户
     * @return 人力定时任务详情信息
     */
    List<TaskDO> batchSave(List<TaskAddDTO> taskAddDTOList, TokenUser tokenUser);

    /**
     * 修改人力定时任务
     *
     * @param taskUpdateDTO 修改人力定时任务DTO
     * @param tokenUser     当前用户
     * @return 更新数量
     */
    int update(TaskUpdateDTO taskUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除人力定时任务，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser 当前用户
     * @param taskIds   人力定时任务id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... taskIds);

    /**
     * 根据人力定时任务id查找
     *
     * @param taskId 人力定时任务id
     * @param siteId 所属站点id
     * @return 人力定时任务详情信息
     */
    TaskVO selectById(String taskId, String siteId);

    /**
     * 根据业务id和业务类型查找
     *
     * @param companyId   用工单位id
     * @param subjectType 业务类型
     * @param siteId      所属站点id
     * @param subjectId   业务id
     * @return 人力定时任务详情信息
     */
    TaskDO selectBySubjectIdAndType(String companyId, String subjectType, String subjectId, String siteId);

    /**
     * 根据公司id,通知类型code,查询未执行的固定通知定时任务
     *
     * @param subjectType 业务类型
     * @param companyId   公司id
     * @param siteId      所属站点id
     * @return 人力定时任务详情信息
     */
    TaskDO selectFixedByCompanyId(String subjectType, String companyId, String siteId);

    /**
     * 查询人力定时任务
     *
     * @param taskQuery 查询条件
     * @param siteId    所属站点id
     * @return 人力定时任务列表信息
     */
    List<TaskListVO> select(TaskQuery taskQuery, String siteId);

    /**
     * 查询人力定时任务记录数
     *
     * @param taskQuery 查询条件
     * @param siteId    所属站点id
     * @return 人力定时任务记录数
     */
    int selectCount(TaskQuery taskQuery, String siteId);

    /**
     * 分页查询人力定时任务
     *
     * @param taskQuery 查询条件
     * @param siteId    所属站点id
     * @return 人力定时任务列表信息
     */
    Page<TaskListVO> selectPage(TaskQuery taskQuery, String siteId);


    /**
     * 根据人力定时任务id查找
     *
     * @param taskId 人力定时任务id
     * @param siteId 所属站点id
     * @return 人力定时任务
     */
    TaskDO selectDOById(String taskId, String siteId);

    /**
     * 查询人力定时任务
     *
     * @param taskQuery 查询条件
     * @param siteId    所属站点id
     * @return 人力定时任务列表
     */
    List<TaskDO> selectDO(TaskQuery taskQuery, String siteId);

    /**
     * 获取等待执行的定时任务
     *
     * @return 等待执行的定时任务
     */
    List<TaskDO> listWaitRuning();

    /**
     * 任务运行成功
     *
     * @param taskId 任务id
     */
    void taskRunEnd(String taskId, TokenUser tokenUser);

    /**
     * 运行定时任务
     *
     * @param taskId 任务id
     */
    void runNoticeTask(String taskId);

    /**
     * 取消定时任务
     * @param subjectId
     * @param subjectType
     * @return
     */
    int cancel(String subjectId,String subjectType);
}


